﻿using System;
using System.Linq;
using System.Windows.Forms;
using OwnZTec.LojaDelivery.Data;
using Telerik.WinControls.UI;
using System.Collections.Generic;

namespace OwnZTec.LojaDelivery.UI.WinForms
{
    public partial class FrmVendas : OwnZForm
    {

        #region -- Membros e Construtores -------------------------------------------------------------------------------------------------
        public FrmVendas()
        {
            InitializeComponent();
            this.ConfigurarFormFilho();
        }

        private void FrmVendas_Load(object sender, EventArgs e)
        {
            carregado = false;
            cmdEditar.Enabled = cmdExcluir.Enabled = false;

            AtualizarGrid();
            CarregaCliente();

            Contexto.MainForm.Cursor = Cursors.Arrow;
            carregado = true;
        }

        private bool carregado;
        #endregion

        #region -- Eventos ----------------------------------------------------------------------------------------------------------------
        private void cmdAdicionar_Click(object sender, EventArgs e)
        {
            var frm = new FrmVendasDetalhes
            {
                Pai = this
            };
            frm.ShowDialog();
        }
        
        private void cmdExcluir_Click(object sender, EventArgs e)
        {
            var res = Contexto.MainForm.ExibirMensagem("Deseja excluir a venda selecionada?",
                                           MessageBoxButtons.YesNo, MessageBoxIcon.Question);

            if (res == DialogResult.No)
                return;

            var idf = ((tbVenda)gvComandas.SelectedRows[0].DataBoundItem).idVenda;

            Contexto.Db.tbVendas.DeleteObject(Contexto.Db.tbVendas.First(f => f.idVenda
                == idf));

            Contexto.Db.SaveChanges();

            AtualizarGrid();
        }

        private void cmdEditar_Click(object sender, EventArgs e)
        {
            var frm = new FrmVendasDetalhes
            {
                Venda = (tbVenda)gvComandas.SelectedRows[0].DataBoundItem,
                Edicao = true,
                Pai = this
            };

            frm.ShowDialog();
        }

        private void cmdAtualizar_Click(object sender, EventArgs e)
        {
            AtualizarGrid();
        }
        
        private void cmdSair_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void gvComandas_DoubleClick(object sender, EventArgs e)
        {
            if (gvComandas.SelectedRows.Count != 1)
                return;

            Vendas_Grid vg = (Vendas_Grid)gvComandas.SelectedRows[0].DataBoundItem;
            
            
            var frm = new FrmVendasDetalhes
            {
                Venda = tbVenda.CreatetbVenda(vg.idPedido, vg.idCliente, vg.Comanda, vg.Data, vg.Qtde, Convert.ToDecimal(vg.Valor.Substring(2).Trim()), "A", 0, false, 0, 0),
                Edicao = true,
                Pai = this
            };

            frm.ShowDialog();
        }

        private void gvComandas_SelectionChanged(object sender, EventArgs e)
        {
            if (gvComandas.SelectedRows.Count == 0)
                cmdEditar.Enabled = cmdExcluir.Enabled = false;
            else if (gvComandas.SelectedRows.Count == 1)
                cmdEditar.Enabled = cmdExcluir.Enabled = true;
            else
            {
                cmdEditar.Enabled = false;
                cmdExcluir.Enabled = true;
            }
        }

        private void gvComandas_FilterPopupRequired(object sender, Telerik.WinControls.UI.FilterPopupRequiredEventArgs e)
        {
            e.FilterPopup = new RadSimpleListFilterPopup(e.Column);
        }

        private void ddlFiltro_SelectedIndexChanged(object sender, Telerik.WinControls.UI.Data.PositionChangedEventArgs e)
        {
            ddlCliente.Visible = false;
            switch (ddlFiltro.SelectedIndex)
            {
                case 0:
                    AtualizarGrid();
                    break;
                case 1:
                    AtualizarGrid(DateTime.Now.AddMonths(-2), -1);
                    break;
                case 2:
                    AtualizarGrid(DateTime.Now.AddMonths(-1), -1);
                    break;
                case 3:
                    AtualizarGrid(DateTime.Now,-1);
                    break;
                case 4:
                    ddlCliente.SelectedIndex = 0;
                    ddlCliente.Visible = true;
                    AtualizarGrid(DateTime.Now, ddlCliente.SelectedItem.Value.ParaInt());
                    break;
                case 5:
                    break;
            }

        }

        private void ddlCliente_SelectedIndexChanged(object sender, Telerik.WinControls.UI.Data.PositionChangedEventArgs e)
        {
            if (carregado)
                AtualizarGrid(DateTime.Now, ddlCliente.SelectedIndex);
        }

        #endregion

        #region -- Metodos ----------------------------------------------------------------------------------------------------------------
        private List<Vendas_Grid> lista;
        public void AtualizarGrid()
        {
            Cursor = Cursors.WaitCursor;

            lista = MontaGridLista(Contexto.Db.tbVendas);

            gvComandas.DataSource = lista;

            Cursor = Cursors.Arrow;
        }

        private List<Vendas_Grid> MontaGridLista(System.Data.Objects.ObjectSet<tbVenda> objectSet)
        {
            List<Vendas_Grid> retorno = new List<Vendas_Grid>();
            Vendas_Grid det = new Vendas_Grid();
            foreach (var item in objectSet.ToList())
            {
                det = new Vendas_Grid();
                det.idPedido = item.idVenda;
                det.idCliente = item.idCliente;
                det.Data = item.dtVenda;
                det.Comanda = item.numeroVenda;
                det.Cliente = Contexto.Db.tbClientes.First(p => p.idCliente == item.idCliente).desCliente;
                det.Qtde = item.qtdeTotal;
                det.Valor = item.valorVenda.ToString("C");
                retorno.Add(det);
            }

            return retorno;
        }

        private void CarregaCliente()
        {
            ddlCliente.DataSource = Contexto.Db.tbClientes.ToList();
            ddlCliente.DisplayMember = "desCliente";
            ddlCliente.ValueMember = "idCliente";
        }

        private void AtualizarGrid(DateTime dtFiltro, int cliente)
        {
            Cursor = Cursors.WaitCursor;
            if (cliente >= 0)
                gvComandas.DataSource = lista.Where(p => p.idCliente >= cliente);
            else
                gvComandas.DataSource = lista.Where(p => p.Data >= dtFiltro);

            Cursor = Cursors.Arrow;
        }

        #endregion
    }

    public class Vendas_Grid
    {
        public int idPedido { get; set; }
        public int Comanda { get; set; }
        public DateTime Data { get; set; }
        public int idCliente { get; set; }
        public string Cliente { get; set; }
        public int Qtde { get; set; }
        public string Valor { get; set; }
    }
}
